Bibliographic Collection
Data source: Clarivate Analytics Web of Science (http://apps.webofknowledge.com)
Data format: Plaintext
Query: TO = “Capacitated Arc Routing” OR “Capacitated General Routing”
Timespan: 2010-2019
Document Type: Articles, letters, review and proceedings papers
Query data: 12 May, 2019
Install and load bibliometrix R-package
# Stable version from CRAN (Comprehensive R Archive Network)
# if you need to execute the code, remove # from the beginning of the next line
# install.packages("bibliometrix")
# Most updated version from GitHub
# if you need to execute the code, remove # from the beginning of the next lines
# install.packages("devtools")
# devtools::install_github("massimoaria/bibliometrix")
library(bibliometrix)
package ‘bibliometrix’ was built under R version 3.5.2To cite bibliometrix in publications, please use:
Aria, M. & Cuccurullo, C. (2017) bibliometrix: An R-tool for comprehensive science mapping analysis, Journal of Informetrics, 11(4), pp 959-975, Elsevier.
http:\\www.bibliometrix.org
To start with the shiny web-interface, please digit:
biblioshiny()
Data Loading and Converting
true_carps <- read.csv("../data/carp_yes_no.csv") %>% filter(CARP..Yes.No. == 1) %>% select(X)
true_carps <- read.csv("../data/carp_yes_no.csv") %>% filter(CARP..Yes.No. == 1) %>% select(X)
D <- readFiles("../data/arp_grp_2010_2019_references.bib")
# Converting the loaded files into a R bibliographic dataframe
M <- convert2df(D, dbsource="isi",format="bibtex")
Converting your isi collection into a bibliographic dataframe
Section 1: Descriptive Analysis
Although bibliometrics is mainly known for quantifying the scientific production and measuring its quality and impact, it is also useful for displaying and analysing the intellectual, conceptual and social structures of research as well as their evolution and dynamical aspects.
In this way, bibliometrics aims to describe how specific disciplines, scientific domains, or research fields are structured and how they evolve over time. In other words, bibliometric methods help to map the science (so-called science mapping) and are very useful in the case of research synthesis, especially for the systematic ones.
Bibliometrics is an academic science founded on a set of statistical methods, which can be used to analyze scientific big data quantitatively and their evolution over time and discover information. Network structure is often used to model the interaction among authors, papers/documents/articles, references, keywords, etc.
Bibliometrix is an open-source software for automating the stages of data-analysis and data-visualization. After converting and uploading bibliographic data in R, Bibliometrix performs a descriptive analysis and different research-structure analysis.
Descriptive analysis provides some snapshots about the annual research development, the top “k” productive authors, papers, countries and most relevant keywords.
Main findings about the collection
#options(width=160)
results <- biblioAnalysis(M)
summary(results, k=10, pause=F, width=130)
Main Information about data
Documents 158
Sources (Journals, Books, etc.) 74
Keywords Plus (ID) 189
Author's Keywords (DE) 339
Period 2010 - 2019
Average citations per documents 9.032
Authors 289
Author Appearances 512
Authors of single-authored documents 8
Authors of multi-authored documents 281
Single-authored documents 8
Documents per Author 0.547
Authors per Document 1.83
Co-Authors per Documents 3.24
Collaboration Index 1.87
Document types
ARTICLE 109
ARTICLE, BOOK CHAPTER 7
ARTICLE, DATA PAPER 1
ARTICLE, PROCEEDINGS PAPER 6
PROCEEDINGS PAPER 35
Annual Scientific Production
Annual Percentage Growth Rate -9.163666
Most Productive Authors
Top manuscripts per citations
Corresponding Author's Countries
SCP: Single Country Publications
MCP: Multiple Country Publications
Total Citations per Country
Most Relevant Sources
Most Relevant Keywords
plot(x=results, k=10, pause=F)





Most Cited References
CR <- citations(M, field = "article", sep = ";")
cbind(CR$Cited[1:20])
[,1]
GOLDEN BL, 1981, NETWORKS, V11, P305, DOI 10.1002/NET.3230110308. 102
GOLDEN BL, 1983, COMPUT OPER RES, V10, P47, DOI 10.1016/0305-0548(83)90026-6. 68
LACOMME P, 2004, ANN OPER RES, V131, P159, DOI 10.1023/B:ANOR.0000039517.35989.6D. 66
BEULLENS P, 2003, EUR J OPER RES, V147, P629, DOI 10.1016/S0377-2217(02)00334-X. 62
BRANDAO J, 2008, COMPUT OPER RES, V35, P1112, DOI 10.1016/J.COR.2006.07.007. 62
BENAVENT E, 1992, NETWORKS, V22, P669, DOI 10.1002/NET.3230220706. 55
HERTZ A, 2000, OPER RES, V48, P129, DOI 10.1287/OPRE.48.1.129.12455. 53
BELENGUER JM, 2003, COMPUT OPER RES, V30, P705, DOI 10.1016/S0305-0548(02)00046-1. 49
ULUSOY G, 1985, EUR J OPER RES, V22, P329, DOI 10.1016/0377-2217(85)90252-8. 48
TANG K, 2009, IEEE T EVOLUT COMPUT, V13, P1151, DOI 10.1109/TEVC.2009.2023449. 47
LONGO H, 2006, COMPUT OPER RES, V33, P1823, DOI 10.1016/J.COR.2004.11.020. 46
DROR M., 2000, ARC ROUTING THEORY S. 43
EGLESE RW, 1994, DISCRETE APPL MATH, V48, P231, DOI 10.1016/0166-218X(92)00003-5. 42
BELENGUER JM, 2006, COMPUT OPER RES, V33, P3363, DOI 10.1016/J.COR.2005.02.009. 37
POLACEK M, 2008, J HEURISTICS, V14, P405, DOI 10.1007/S10732-007-9050-2. 36
HERTZ A, 2001, TRANSPORT SCI, V35, P425, DOI 10.1287/TRSC.35.4.425.10431. 35
LI LYO, 1996, J OPER RES SOC, V47, P217, DOI 10.1057/JORS.1996.20. 35
BALDACCI R, 2006, NETWORKS, V47, P52, DOI [10.1002/NET.20091, 10.1002/NET.20091]. 32
CORBERAN A, 2010, NETWORKS, V56, P50, DOI 10.1002/NET.20347. 31
WOHLK S, 2008, OPER RES COMPUT SCI, V43, P29, DOI 10.1007/978-0-387-77778-8\\_2. 30
Section 2: The Intellectual Structure of the field - Co-citation Analysis
Citation analysis is one of the main classic techniques in bibliometrics. It shows the structure of a specific field through the linkages between nodes (e.g. authors, papers, journal), while the edges can be differently interpretated depending on the network type, that are namely co-citation, direct citation, bibliographic coupling. Please see Aria, Cuccurullo (2017).
Below there are three examples.
First, a co-citation network that shows relations between cited-reference works (nodes).
Second, a co-citation network that uses cited-journals as unit of analysis.
The useful dimensions to comment the co-citation networks are: (i) centrality and peripherality of nodes, (ii) their proximity and distance, (iii) strength of ties, (iv) clusters, (iiv) bridging contributions.
Third, a historiograph is built on direct citations. It draws the intellectual linkages in a historical order. Cited works of thousands of authors contained in a collection of published scientific articles is sufficient for recostructing the historiographic structure of the field, calling out the basic works in it.
Article (References) co-citation analysis
Plot options:
n = 50 (the funxtion plots the main 50 cited references)
type = “fruchterman” (the network layout is generated using the Fruchterman-Reingold Algorithm)
size.cex = TRUE (the size of the vertices is proportional to their degree)
size = 20 (the max size of vertices)
remove.multiple=FALSE (multiple edges are not removed)
labelsize = 0.7 (defines the size of vertex labels)
edgesize = 10 (The thickness of the edges is proportional to their strength. Edgesize defines the max value of the thickness)
edges.min = 5 (plots only edges with a strength greater than or equal to 5)
all other arguments assume the default values
NetMatrix <- biblioNetwork(M, analysis = "co-citation", network = "references", sep = ";")
net=networkPlot(NetMatrix, n = 50, Title = "Citation Network", type = "fruchterman", size.cex=TRUE, size=20, remove.multiple=FALSE, labelsize=0.7,edgesize = 10, edges.min=5)

Descriptive analysis of Article co-citation network characteristics
netstat <- networkStat(NetMatrix)
summary(netstat,k=10)
Main statistics about the network
Size 2363
Density 0.039
Transitivity 0.395
Diameter 4
Degree Centralization 0.633
Average path length 2.164
Journal (Source) co-citation analysis
M=metaTagExtraction(M,"CR_SO",sep=";")
NetMatrix <- biblioNetwork(M, analysis = "co-citation", network = "sources", sep = ";")
net=networkPlot(NetMatrix, n = 50, Title = "Co-Citation Network", type = "auto", size.cex=TRUE, size=15, remove.multiple=FALSE, labelsize=0.7,edgesize = 10, edges.min=5)

Descriptive analysis of Journal co-citation network characteristics
netstat <- networkStat(NetMatrix)
summary(netstat,k=10)
Main statistics about the network
Size 1028
Density 0.054
Transitivity 0.253
Diameter 3
Degree Centralization 0.879
Average path length 1.958
Section 3: Historiograph - Direct citation linkages
histResults <- histNetwork(M, min.citations=quantile(M$TC,0.75), sep = ";")
Articles analysed 44
options(width = 100)
net <- histPlot(histResults, n=20, size.cex=TRUE, size = 5, labelsize = 3, arrowsize = 0.5)
Legend

Section 4: The conceptual structure - Co-Word Analysis
Co-word networks show the conceptual structure, that uncovers links between concepts through term co-occurences.
Conceptual structure is often used to understand the topics covered by scholars (so-called research front) and identify what are the most important and the most recent issues.
Dividing the whole timespan in different timeslices and comparing the conceptual structures is useful to analyze the evolution of topics over time.
Bibliometrix is able to analyze keywords, but also the terms in the articles’ titles and abstracts. It does it using network analysis or correspondance analysis (CA) or multiple correspondance analysis (MCA). CA and MCA visualise the conceptual structure in a two-dimensional plot.
Co-word Analysis through Keyword co-occurrences
Plot options:
normalize = “association” (the vertex similarities are normalized using association strength)
n = 50 (the function plots the main 50 cited references)
type = “fruchterman” (the network layout is generated using the Fruchterman-Reingold Algorithm)
size.cex = TRUE (the size of the vertices is proportional to their degree)
size = 20 (the max size of the vertices)
remove.multiple=FALSE (multiple edges are not removed)
labelsize = 3 (defines the max size of vertex labels)
label.cex = TRUE (The vertex label sizes are proportional to their degree)
edgesize = 10 (The thickness of the edges is proportional to their strength. Edgesize defines the max value of the thickness)
label.n = 30 (Labels are plotted only for the main 30 vertices)
edges.min = 25 (plots only edges with a strength greater than or equal to 2)
all other arguments assume the default values
NetMatrix <- biblioNetwork(M, analysis = "co-occurrences", network = "keywords", sep = ";")
net=networkPlot(NetMatrix, normalize="association", n = 50, Title = "Keyword Co-occurrences", type = "fruchterman", size.cex=TRUE, size=20, remove.multiple=F, edgesize = 10, labelsize=3,label.cex=TRUE,label.n=30,edges.min=2)

Descriptive analysis of keyword co-occurrences network characteristics
netstat <- networkStat(NetMatrix)
summary(netstat,k=10)
Main statistics about the network
Size 191
Density 0.057
Transitivity 0.359
Diameter 6
Degree Centralization 0.233
Average path length 2.564
Co-word Analysis through Correspondence Analysis
CS <- conceptualStructure(M, method="CA", field="ID", minDegree=10, k.max = 8, stemming=f, labelsize=8,documents=20)




Section 5: Thematic Map
Co-word analysis draws clusters of keywords. They are considered as themes, whose density and centrality can be used in classifying themes and mapping in a two-dimensional diagram.
Thematic map is a very intuitive plot and we can analyze themes according to the quadrant in which they are placed: (1) upper-right quadrant: motor-themes; (2) lower-right quadrant: basic themes; (3) lower-left quadrant: emerging or disappearing themes; (4) upper-left quadrant: very specialized/niche themes.
Please see Cobo, M. J., L?pez-Herrera, A. G., Herrera-Viedma, E., & Herrera, F. (2011). An approach for detecting, quantifying, and visualizing the evolution of a research field: A practical application to the fuzzy sets theory field. Journal of Informetrics, 5(1), 146-166.
Map=thematicMap(M, field = "ID", n = 250, minfreq = 5,
stemming = FALSE, size = 0.5, repel = TRUE)
plot(Map$map)

Cluster description
Clusters=Map$words[order(Map$words$Cluster,-Map$words$Occurrences),]
library(dplyr)
CL <- Clusters %>% group_by(.data$Cluster_Label) %>% top_n(5, .data$Occurrences)
CL
Section 6: The social structure - Collaboration Analysis
Collaboration networks show how authors, institutions (e.g. universities or departments) and countries relate to others in a specific field of research. For example, the first figure below is a co-author network. It discovers regular study groups, hidden groups of scholars, and pivotal authors. The second figure is called “Edu collaboration network” and uncovers relevant institutions in a specific research field and their relations.
Author collaboration network
NetMatrix <- biblioNetwork(M, analysis = "collaboration", network = "authors", sep = ";")
net=networkPlot(NetMatrix, n = 50, Title = "Author collaboration",type = "auto", size=10,size.cex=T,edgesize = 3,labelsize=0.6)
Descriptive analysis of author collaboration network characteristics
netstat <- networkStat(NetMatrix)
summary(netstat,k=15)
Main statistics about the network
Size 289
Density 0.013
Transitivity 0.568
Diameter 7
Degree Centralization 0.05
Average path length 2.965
Edu collaboration network
NetMatrix <- biblioNetwork(M, analysis = "collaboration", network = "universities", sep = ";")
net=networkPlot(NetMatrix, n = 50, Title = "Edu collaboration",type = "auto", size=10,size.cex=T,edgesize = 3,labelsize=0.6)
Descriptive analysis of edu collaboration network characteristics
netstat <- networkStat(NetMatrix)
summary(netstat,k=15)
Main statistics about the network
Size 157
Density 0.013
Transitivity 0.439
Diameter 7
Degree Centralization 0.064
Average path length 2.944
Country collaboration network
M <- metaTagExtraction(M, Field = "AU_CO", sep = ";")
NetMatrix <- biblioNetwork(M, analysis = "collaboration", network = "countries", sep = ";")
net=networkPlot(NetMatrix, n = dim(NetMatrix)[1], Title = "Country collaboration",type = "sphere", size=10,size.cex=T,edgesize = 1,labelsize=0.6, cluster="none")
Descriptive analysis of country collaboration network characteristics
netstat <- networkStat(NetMatrix)
summary(netstat,k=15)
Main statistics about the network
Size 37
Density 0.071
Transitivity 0.274
Diameter 4
Degree Centralization 0.291
Average path length 2.396
LS0tCnRpdGxlOiAiU2NpZW5jZSBNYXBwaW5nIEFuYWx5c2lzIHdpdGggYmlibGlvbWV0cml4IFItcGFja2FnZTogQ0FSUCBhbmQgR1JQIgphdXRob3I6IEVsaWFzIEouIFdpbGxlbXNlCmRhdGU6IE1heSAxMiwgMjAxOQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICBwcmV0dHlkb2M6Omh0bWxfcHJldHR5OgogICAgdGhlbWU6IGhwc3RyCiAgICBoaWdobGlnaHQ6IGdpdGh1YgotLS0KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMgSW5zdGFsbGF0aW9uIG9mIHNvbWUgdXNlZnVsIHBhY2thZ2VzCmlmKCFpc1RSVUUocmVxdWlyZSgicHJldHR5ZG9jIikpKXtpbnN0YWxsLnBhY2thZ2VzKCJwcmV0dHlkb2MiKX0KaWYoIWlzVFJVRShyZXF1aXJlKCJyaW8iKSkpe2luc3RhbGwucGFja2FnZXMoInJpbyIpfQpsaWJyYXJ5KHByZXR0eWRvYykKbGlicmFyeShyaW8pCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCgojIEJpYmxpb2dyYXBoaWMgQ29sbGVjdGlvbgoKKipEYXRhIHNvdXJjZSoqOiAgIENsYXJpdmF0ZSBBbmFseXRpY3MgV2ViIG9mIFNjaWVuY2UgKGh0dHA6Ly9hcHBzLndlYm9ma25vd2xlZGdlLmNvbSkKCioqRGF0YSBmb3JtYXQqKjogICBQbGFpbnRleHQKCioqUXVlcnkqKjogICAgICAgICBUTyA9ICJDYXBhY2l0YXRlZCBBcmMgUm91dGluZyIgT1IgIkNhcGFjaXRhdGVkIEdlbmVyYWwgUm91dGluZyIKCioqVGltZXNwYW4qKjogICAgICAyMDEwLTIwMTkKCioqRG9jdW1lbnQgVHlwZSoqOiBBcnRpY2xlcywgbGV0dGVycywgcmV2aWV3IGFuZCBwcm9jZWVkaW5ncyBwYXBlcnMKCioqUXVlcnkgZGF0YSoqOiAgICAxMiBNYXksIDIwMTkKCgojIEluc3RhbGwgYW5kIGxvYWQgYmlibGlvbWV0cml4IFItcGFja2FnZQpgYGB7ciBsb2FkIGJpYmxpb21ldHJpeH0KIyBTdGFibGUgdmVyc2lvbiBmcm9tIENSQU4gKENvbXByZWhlbnNpdmUgUiBBcmNoaXZlIE5ldHdvcmspCiMgaWYgeW91IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29kZSwgcmVtb3ZlICMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUKCiMgaW5zdGFsbC5wYWNrYWdlcygiYmlibGlvbWV0cml4IikKCgojIE1vc3QgdXBkYXRlZCB2ZXJzaW9uIGZyb20gR2l0SHViCiMgaWYgeW91IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29kZSwgcmVtb3ZlICMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmVzCgojIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoIm1hc3NpbW9hcmlhL2JpYmxpb21ldHJpeCIpCgpsaWJyYXJ5KGJpYmxpb21ldHJpeCkKYGBgCgoKIyBEYXRhIExvYWRpbmcgYW5kIENvbnZlcnRpbmcKYGBge3IgRGF0YSBsb2FkaW5nLCB3YXJuaW5nPUZBTFNFfQojIExvYWRpbmcgdHh0IG9yIGJpYiBmaWxlcyBpbnRvIFIgZW52aXJvbm1lbnQKRCA8LSByZWFkRmlsZXMoIi4uL2RhdGEvYXJwX2dycF8yMDEwXzIwMTlfcmVmZXJlbmNlcy5iaWIiKQoKIyBDb252ZXJ0aW5nIHRoZSBsb2FkZWQgZmlsZXMgaW50byBhIFIgYmlibGlvZ3JhcGhpYyBkYXRhZnJhbWUKTSA8LSBjb252ZXJ0MmRmKEQsIGRic291cmNlPSJpc2kiLGZvcm1hdD0iYmlidGV4IikKTSA8LSBNICU+JSBmaWx0ZXIoUFkgPj0gMjAxMCkKdHJ1ZV9jYXJwcyA8LSByZWFkLmNzdigiLi4vZGF0YS9jYXJwX3llc19uby5jc3YiKSAlPiUgZmlsdGVyKENBUlAuLlllcy5Oby4gPT0gMSkgJT4lIHNlbGVjdChYKQoKTV9yZWQgPC0gTSAlPiUgc2VtaV9qb2luKHNlbGVjdCh0cnVlX2NhcnBzKSkKI00yIDwtIE0KI00yCiN3cml0ZS5jc3YoTTIsICcuLi9kYXRhL2FycF9ncnBfMjAxMF8yMDE5X3JlZmVyZW5jZXMuY3N2JykKYGBgCgpgYGB7cn0KCmBgYAoKIyBTZWN0aW9uIDE6IERlc2NyaXB0aXZlIEFuYWx5c2lzCgpBbHRob3VnaCBiaWJsaW9tZXRyaWNzIGlzIG1haW5seSBrbm93biBmb3IgcXVhbnRpZnlpbmcgdGhlIHNjaWVudGlmaWMgcHJvZHVjdGlvbiBhbmQgbWVhc3VyaW5nIGl0cyBxdWFsaXR5IGFuZCBpbXBhY3QsIGl0IGlzIGFsc28gdXNlZnVsIGZvciBkaXNwbGF5aW5nIGFuZCBhbmFseXNpbmcgdGhlIGludGVsbGVjdHVhbCwgY29uY2VwdHVhbCBhbmQgc29jaWFsIHN0cnVjdHVyZXMgb2YgcmVzZWFyY2ggYXMgd2VsbCBhcyB0aGVpciBldm9sdXRpb24gYW5kIGR5bmFtaWNhbCBhc3BlY3RzLiAKCkluIHRoaXMgd2F5LCBiaWJsaW9tZXRyaWNzIGFpbXMgdG8gZGVzY3JpYmUgaG93IHNwZWNpZmljIGRpc2NpcGxpbmVzLCBzY2llbnRpZmljIGRvbWFpbnMsIG9yIHJlc2VhcmNoIGZpZWxkcyBhcmUgc3RydWN0dXJlZCBhbmQgaG93IHRoZXkgZXZvbHZlIG92ZXIgdGltZS4gSW4gb3RoZXIgd29yZHMsIGJpYmxpb21ldHJpYyBtZXRob2RzIGhlbHAgdG8gbWFwIHRoZSBzY2llbmNlIChzby1jYWxsZWQgc2NpZW5jZSBtYXBwaW5nKSBhbmQgYXJlIHZlcnkgdXNlZnVsIGluIHRoZSBjYXNlIG9mIHJlc2VhcmNoIHN5bnRoZXNpcywgZXNwZWNpYWxseSBmb3IgdGhlIHN5c3RlbWF0aWMgb25lcy4KCkJpYmxpb21ldHJpY3MgaXMgYW4gYWNhZGVtaWMgc2NpZW5jZSBmb3VuZGVkIG9uIGEgc2V0IG9mIHN0YXRpc3RpY2FsIG1ldGhvZHMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgc2NpZW50aWZpYyBiaWcgZGF0YSBxdWFudGl0YXRpdmVseSBhbmQgdGhlaXIgZXZvbHV0aW9uIG92ZXIgdGltZSBhbmQgZGlzY292ZXIgaW5mb3JtYXRpb24uIE5ldHdvcmsgc3RydWN0dXJlIGlzIG9mdGVuIHVzZWQgdG8gbW9kZWwgdGhlIGludGVyYWN0aW9uIGFtb25nIGF1dGhvcnMsIHBhcGVycy9kb2N1bWVudHMvYXJ0aWNsZXMsIHJlZmVyZW5jZXMsIGtleXdvcmRzLCBldGMuCgpCaWJsaW9tZXRyaXggaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgZm9yIGF1dG9tYXRpbmcgdGhlIHN0YWdlcyBvZiBkYXRhLWFuYWx5c2lzIGFuZCBkYXRhLXZpc3VhbGl6YXRpb24uIEFmdGVyIGNvbnZlcnRpbmcgYW5kIHVwbG9hZGluZyBiaWJsaW9ncmFwaGljIGRhdGEgaW4gUiwgQmlibGlvbWV0cml4IHBlcmZvcm1zIGEgZGVzY3JpcHRpdmUgYW5hbHlzaXMgYW5kIGRpZmZlcmVudCByZXNlYXJjaC1zdHJ1Y3R1cmUgYW5hbHlzaXMuCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBwcm92aWRlcyBzb21lIHNuYXBzaG90cyBhYm91dCB0aGUgYW5udWFsIHJlc2VhcmNoIGRldmVsb3BtZW50LCB0aGUgdG9wICJrIiBwcm9kdWN0aXZlIGF1dGhvcnMsIHBhcGVycywgY291bnRyaWVzIGFuZCBtb3N0IHJlbGV2YW50IGtleXdvcmRzLgoKCgojIyBNYWluIGZpbmRpbmdzIGFib3V0IHRoZSBjb2xsZWN0aW9uCgpgYGB7ciBEZXNjcmlwdGl2ZSBBbmFseXNpcywgZWNobz1UUlVFLCBjb21tZW50PU5BfQojb3B0aW9ucyh3aWR0aD0xNjApCnJlc3VsdHMgPC0gYmlibGlvQW5hbHlzaXMoTSkKc3VtbWFyeShyZXN1bHRzLCBrPTEwLCBwYXVzZT1GLCB3aWR0aD0xMzApCnBsb3QoeD1yZXN1bHRzLCBrPTEwLCBwYXVzZT1GKQpgYGAKCiMjIE1vc3QgQ2l0ZWQgUmVmZXJlbmNlcwoKYGBge3IgTW9zdCBjaXRlZCByZWZlcmVuY2VzLCAgY29tbWVudD1OQX0KQ1IgPC0gY2l0YXRpb25zKE0sIGZpZWxkID0gImFydGljbGUiLCBzZXAgPSAiOyIpCmNiaW5kKENSJENpdGVkWzE6MjBdKQpgYGAKCgojIFNlY3Rpb24gMjogVGhlIEludGVsbGVjdHVhbCBTdHJ1Y3R1cmUgb2YgdGhlIGZpZWxkIC0gQ28tY2l0YXRpb24gQW5hbHlzaXMKCkNpdGF0aW9uIGFuYWx5c2lzIGlzIG9uZSBvZiB0aGUgbWFpbiBjbGFzc2ljIHRlY2huaXF1ZXMgaW4gYmlibGlvbWV0cmljcy4gSXQgc2hvd3MgdGhlIHN0cnVjdHVyZSBvZiBhIHNwZWNpZmljIGZpZWxkIHRocm91Z2ggdGhlIGxpbmthZ2VzIGJldHdlZW4gbm9kZXMgKGUuZy4gYXV0aG9ycywgcGFwZXJzLCBqb3VybmFsKSwgd2hpbGUgdGhlIGVkZ2VzIGNhbiBiZSBkaWZmZXJlbnRseSBpbnRlcnByZXRhdGVkIGRlcGVuZGluZyBvbiB0aGUgbmV0d29yayB0eXBlLCB0aGF0IGFyZSBuYW1lbHkgY28tY2l0YXRpb24sIGRpcmVjdCBjaXRhdGlvbiwgYmlibGlvZ3JhcGhpYyBjb3VwbGluZy4gUGxlYXNlIHNlZSBBcmlhLCBDdWNjdXJ1bGxvICgyMDE3KS4KCkJlbG93IHRoZXJlIGFyZSB0aHJlZSBleGFtcGxlcy4KCkZpcnN0LCBhIGNvLWNpdGF0aW9uIG5ldHdvcmsgdGhhdCBzaG93cyByZWxhdGlvbnMgYmV0d2VlbiBjaXRlZC1yZWZlcmVuY2Ugd29ya3MgKG5vZGVzKS4KClNlY29uZCwgYSBjby1jaXRhdGlvbiBuZXR3b3JrIHRoYXQgdXNlcyBjaXRlZC1qb3VybmFscyBhcyB1bml0IG9mIGFuYWx5c2lzLgoKVGhlIHVzZWZ1bCBkaW1lbnNpb25zIHRvIGNvbW1lbnQgdGhlIGNvLWNpdGF0aW9uIG5ldHdvcmtzIGFyZTogKGkpIGNlbnRyYWxpdHkgYW5kIHBlcmlwaGVyYWxpdHkgb2Ygbm9kZXMsIChpaSkgdGhlaXIgcHJveGltaXR5IGFuZCBkaXN0YW5jZSwgKGlpaSkgc3RyZW5ndGggb2YgdGllcywgKGl2KSBjbHVzdGVycywgKGlpdikgYnJpZGdpbmcgY29udHJpYnV0aW9ucy4KClRoaXJkLCBhIGhpc3RvcmlvZ3JhcGggaXMgYnVpbHQgb24gZGlyZWN0IGNpdGF0aW9ucy4gSXQgZHJhd3MgdGhlIGludGVsbGVjdHVhbCBsaW5rYWdlcyBpbiBhIGhpc3RvcmljYWwgb3JkZXIuIENpdGVkIHdvcmtzIG9mCnRob3VzYW5kcyBvZiBhdXRob3JzIGNvbnRhaW5lZCBpbiBhIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVkIHNjaWVudGlmaWMgYXJ0aWNsZXMgaXMgc3VmZmljaWVudCBmb3IgcmVjb3N0cnVjdGluZyB0aGUgaGlzdG9yaW9ncmFwaGljIHN0cnVjdHVyZSBvZiB0aGUgZmllbGQsIGNhbGxpbmcgb3V0IHRoZSBiYXNpYyB3b3JrcyBpbiBpdC4KCgojIyBBcnRpY2xlIChSZWZlcmVuY2VzKSBjby1jaXRhdGlvbiBhbmFseXNpcwoqKlBsb3Qgb3B0aW9ucyoqOgoKKiBuID0gNTAgKHRoZSBmdW54dGlvbiBwbG90cyB0aGUgbWFpbiA1MCBjaXRlZCByZWZlcmVuY2VzKQoKKiB0eXBlID0gImZydWNodGVybWFuIiAodGhlIG5ldHdvcmsgbGF5b3V0IGlzIGdlbmVyYXRlZCB1c2luZyB0aGUgRnJ1Y2h0ZXJtYW4tUmVpbmdvbGQgQWxnb3JpdGhtKQoKKiBzaXplLmNleCA9IFRSVUUgKHRoZSBzaXplIG9mIHRoZSB2ZXJ0aWNlcyBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgZGVncmVlKQoKKiBzaXplID0gMjAgKHRoZSBtYXggc2l6ZSBvZiB2ZXJ0aWNlcykKCiogcmVtb3ZlLm11bHRpcGxlPUZBTFNFIChtdWx0aXBsZSBlZGdlcyBhcmUgbm90IHJlbW92ZWQpCgoqIGxhYmVsc2l6ZSA9IDAuNyAoZGVmaW5lcyB0aGUgc2l6ZSBvZiB2ZXJ0ZXggbGFiZWxzKQoKKiBlZGdlc2l6ZSA9IDEwIChUaGUgdGhpY2tuZXNzIG9mIHRoZSBlZGdlcyBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgc3RyZW5ndGguIEVkZ2VzaXplIGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgdGhpY2tuZXNzKQoKKiBlZGdlcy5taW4gPSA1IChwbG90cyBvbmx5IGVkZ2VzIHdpdGggYSBzdHJlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNSkKCiogYWxsIG90aGVyIGFyZ3VtZW50cyBhc3N1bWUgdGhlIGRlZmF1bHQgdmFsdWVzCgpgYGB7ciBDby1jaXRhdGlvbiBuZXR3b3JrLCBjb21tZW50PU5BLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9Ck5ldE1hdHJpeCA8LSBiaWJsaW9OZXR3b3JrKE0sIGFuYWx5c2lzID0gImNvLWNpdGF0aW9uIiwgbmV0d29yayA9ICJyZWZlcmVuY2VzIiwgc2VwID0gIjsiKQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBuID0gNTAsIFRpdGxlID0gIkNpdGF0aW9uIE5ldHdvcmsiLCB0eXBlID0gImZydWNodGVybWFuIiwgc2l6ZS5jZXg9VFJVRSwgc2l6ZT0yMCwgcmVtb3ZlLm11bHRpcGxlPUZBTFNFLCBsYWJlbHNpemU9MC43LGVkZ2VzaXplID0gMTAsIGVkZ2VzLm1pbj01KQpgYGAKCkRlc2NyaXB0aXZlIGFuYWx5c2lzIG9mIEFydGljbGUgY28tY2l0YXRpb24gbmV0d29yayBjaGFyYWN0ZXJpc3RpY3MKYGBge3IgQ28tY2l0YXRpb24gbmV0IHN0YXQsIGNvbW1lbnQ9TkF9Cm5ldHN0YXQgPC0gbmV0d29ya1N0YXQoTmV0TWF0cml4KQpzdW1tYXJ5KG5ldHN0YXQsaz0xMCkKYGBgCgoKIyMgSm91cm5hbCAoU291cmNlKSBjby1jaXRhdGlvbiBhbmFseXNpcwoKYGBge3IgQ28tY2l0YXRpb24gc291cmNlIG5ldHdvcmssIGNvbW1lbnQ9TkEsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KTT1tZXRhVGFnRXh0cmFjdGlvbihNLCJDUl9TTyIsc2VwPSI7IikKTmV0TWF0cml4IDwtIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY28tY2l0YXRpb24iLCBuZXR3b3JrID0gInNvdXJjZXMiLCBzZXAgPSAiOyIpCm5ldD1uZXR3b3JrUGxvdChOZXRNYXRyaXgsIG4gPSA1MCwgVGl0bGUgPSAiQ28tQ2l0YXRpb24gTmV0d29yayIsIHR5cGUgPSAiYXV0byIsIHNpemUuY2V4PVRSVUUsIHNpemU9MTUsIHJlbW92ZS5tdWx0aXBsZT1GQUxTRSwgbGFiZWxzaXplPTAuNyxlZGdlc2l6ZSA9IDEwLCBlZGdlcy5taW49NSkKYGBgCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBvZiBKb3VybmFsIGNvLWNpdGF0aW9uIG5ldHdvcmsgY2hhcmFjdGVyaXN0aWNzCmBgYHtyIFNvIENvLWNpdGF0aW9uIG5ldCBzdGF0LCBjb21tZW50PU5BfQpuZXRzdGF0IDwtIG5ldHdvcmtTdGF0KE5ldE1hdHJpeCkKc3VtbWFyeShuZXRzdGF0LGs9MTApCmBgYAoKCiMgU2VjdGlvbiAzOiBIaXN0b3Jpb2dyYXBoIC0gRGlyZWN0IGNpdGF0aW9uIGxpbmthZ2VzCgoKYGBge3IgRGlyZWN0IGNpdGF0aW9uIG5ldHdvcmssIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KaGlzdFJlc3VsdHMgPC0gaGlzdE5ldHdvcmsoTSwgbWluLmNpdGF0aW9ucz1xdWFudGlsZShNJFRDLDAuNzUpLCBzZXAgPSAiOyIpCmBgYAoKYGBge3IgSGlzdG9yaW9ncmFwaCwgY29tbWVudD1OQSwgZmlnLmhlaWdodD03LGZpZy53aWR0aD0xMH0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKbmV0IDwtIGhpc3RQbG90KGhpc3RSZXN1bHRzLCBuPTIwLCBzaXplLmNleD1UUlVFLCBzaXplID0gNSwgbGFiZWxzaXplID0gMywgYXJyb3dzaXplID0gMC41KQpgYGAKCgojIFNlY3Rpb24gNDogVGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIC0gQ28tV29yZCBBbmFseXNpcwoKQ28td29yZCBuZXR3b3JrcyBzaG93IHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSwgdGhhdCB1bmNvdmVycyBsaW5rcyBiZXR3ZWVuIGNvbmNlcHRzIHRocm91Z2ggdGVybSBjby1vY2N1cmVuY2VzLgoKQ29uY2VwdHVhbCBzdHJ1Y3R1cmUgaXMgb2Z0ZW4gdXNlZCB0byB1bmRlcnN0YW5kIHRoZSB0b3BpY3MgY292ZXJlZCBieSBzY2hvbGFycyAoc28tY2FsbGVkIHJlc2VhcmNoIGZyb250KSBhbmQgaWRlbnRpZnkgd2hhdCBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCB0aGUgbW9zdCByZWNlbnQgaXNzdWVzLgoKRGl2aWRpbmcgdGhlIHdob2xlIHRpbWVzcGFuIGluIGRpZmZlcmVudCB0aW1lc2xpY2VzIGFuZCBjb21wYXJpbmcgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlcyBpcyB1c2VmdWwgdG8gYW5hbHl6ZSB0aGUgZXZvbHV0aW9uIG9mIHRvcGljcyBvdmVyIHRpbWUuCgpCaWJsaW9tZXRyaXggaXMgYWJsZSB0byBhbmFseXplIGtleXdvcmRzLCBidXQgYWxzbyB0aGUgdGVybXMgaW4gdGhlIGFydGljbGVzJyB0aXRsZXMgYW5kIGFic3RyYWN0cy4gSXQgZG9lcyBpdCB1c2luZyBuZXR3b3JrIGFuYWx5c2lzIG9yIGNvcnJlc3BvbmRhbmNlIGFuYWx5c2lzIChDQSkgb3IgbXVsdGlwbGUgY29ycmVzcG9uZGFuY2UgYW5hbHlzaXMgKE1DQSkuIENBIGFuZCBNQ0EgdmlzdWFsaXNlIHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSBpbiBhIHR3by1kaW1lbnNpb25hbCBwbG90LgogCgojIyBDby13b3JkIEFuYWx5c2lzIHRocm91Z2ggS2V5d29yZCBjby1vY2N1cnJlbmNlcwoKKipQbG90IG9wdGlvbnMqKjoKCiogbm9ybWFsaXplID0gImFzc29jaWF0aW9uIiAodGhlIHZlcnRleCBzaW1pbGFyaXRpZXMgYXJlIG5vcm1hbGl6ZWQgdXNpbmcgYXNzb2NpYXRpb24gc3RyZW5ndGgpCgoqIG4gPSA1MCAodGhlIGZ1bmN0aW9uIHBsb3RzIHRoZSBtYWluIDUwIGNpdGVkIHJlZmVyZW5jZXMpCgoqIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iICh0aGUgbmV0d29yayBsYXlvdXQgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBGcnVjaHRlcm1hbi1SZWluZ29sZCBBbGdvcml0aG0pCgoqIHNpemUuY2V4ID0gVFJVRSAodGhlIHNpemUgb2YgdGhlIHZlcnRpY2VzIGlzIHByb3BvcnRpb25hbCB0byB0aGVpciBkZWdyZWUpCgoqIHNpemUgPSAyMCAodGhlIG1heCBzaXplIG9mIHRoZSB2ZXJ0aWNlcykgCgoqIHJlbW92ZS5tdWx0aXBsZT1GQUxTRSAobXVsdGlwbGUgZWRnZXMgYXJlIG5vdCByZW1vdmVkKQoKKiBsYWJlbHNpemUgPSAzIChkZWZpbmVzIHRoZSBtYXggc2l6ZSBvZiB2ZXJ0ZXggbGFiZWxzKQoKKiBsYWJlbC5jZXggPSBUUlVFIChUaGUgdmVydGV4IGxhYmVsIHNpemVzIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgZGVncmVlKQoKKiBlZGdlc2l6ZSA9IDEwIChUaGUgdGhpY2tuZXNzIG9mIHRoZSBlZGdlcyBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgc3RyZW5ndGguIEVkZ2VzaXplIGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgdGhpY2tuZXNzKQoKKiBsYWJlbC5uID0gMzAgKExhYmVscyBhcmUgcGxvdHRlZCBvbmx5IGZvciB0aGUgbWFpbiAzMCB2ZXJ0aWNlcykKCiogZWRnZXMubWluID0gMjUgKHBsb3RzIG9ubHkgZWRnZXMgd2l0aCBhIHN0cmVuZ3RoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyKQoKKiBhbGwgb3RoZXIgYXJndW1lbnRzIGFzc3VtZSB0aGUgZGVmYXVsdCB2YWx1ZXMKCmBgYHtyIEtleXdvcmQgY28tb2NjdXJyZW5jZXMsIGNvbW1lbnQ9TkEsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KTmV0TWF0cml4IDwtIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY28tb2NjdXJyZW5jZXMiLCBuZXR3b3JrID0gImtleXdvcmRzIiwgc2VwID0gIjsiKQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBub3JtYWxpemU9ImFzc29jaWF0aW9uIiwgbiA9IDUwLCBUaXRsZSA9ICJLZXl3b3JkIENvLW9jY3VycmVuY2VzIiwgdHlwZSA9ICJmcnVjaHRlcm1hbiIsIHNpemUuY2V4PVRSVUUsIHNpemU9MjAsIHJlbW92ZS5tdWx0aXBsZT1GLCBlZGdlc2l6ZSA9IDEwLCBsYWJlbHNpemU9MyxsYWJlbC5jZXg9VFJVRSxsYWJlbC5uPTMwLGVkZ2VzLm1pbj0yKQpgYGAKCkRlc2NyaXB0aXZlIGFuYWx5c2lzIG9mIGtleXdvcmQgY28tb2NjdXJyZW5jZXMgbmV0d29yayBjaGFyYWN0ZXJpc3RpY3MKCmBgYHtyIEtleXdvcmQgbmV0IHN0YXQsIGNvbW1lbnQ9TkF9Cm5ldHN0YXQgPC0gbmV0d29ya1N0YXQoTmV0TWF0cml4KQpzdW1tYXJ5KG5ldHN0YXQsaz0xMCkKYGBgCgoKIyMgQ28td29yZCBBbmFseXNpcyB0aHJvdWdoIENvcnJlc3BvbmRlbmNlIEFuYWx5c2lzCgpgYGB7ciBDby13b3JkIEFuYWx5c2lzLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9CkNTIDwtIGNvbmNlcHR1YWxTdHJ1Y3R1cmUoTSwgbWV0aG9kPSJDQSIsIGZpZWxkPSJJRCIsIG1pbkRlZ3JlZT0xMCwgay5tYXggPSA4LCBzdGVtbWluZz1mLCBsYWJlbHNpemU9OCxkb2N1bWVudHM9MjApCmBgYAoKCgojIFNlY3Rpb24gNTogVGhlbWF0aWMgTWFwCgpDby13b3JkIGFuYWx5c2lzIGRyYXdzIGNsdXN0ZXJzIG9mIGtleXdvcmRzLiBUaGV5IGFyZSBjb25zaWRlcmVkIGFzIHRoZW1lcywgd2hvc2UgZGVuc2l0eSBhbmQgY2VudHJhbGl0eSBjYW4gYmUgdXNlZCBpbiBjbGFzc2lmeWluZyB0aGVtZXMgYW5kIG1hcHBpbmcgaW4gYSB0d28tZGltZW5zaW9uYWwgZGlhZ3JhbS4KClRoZW1hdGljIG1hcCBpcyBhIHZlcnkgaW50dWl0aXZlIHBsb3QgYW5kIHdlIGNhbiBhbmFseXplIHRoZW1lcyBhY2NvcmRpbmcgdG8gdGhlIHF1YWRyYW50IGluIHdoaWNoIHRoZXkgYXJlIHBsYWNlZDogKDEpIHVwcGVyLXJpZ2h0IHF1YWRyYW50OiBtb3Rvci10aGVtZXM7ICgyKSBsb3dlci1yaWdodCBxdWFkcmFudDogYmFzaWMgdGhlbWVzOyAoMykgbG93ZXItbGVmdCBxdWFkcmFudDogZW1lcmdpbmcgb3IgZGlzYXBwZWFyaW5nIHRoZW1lczsgKDQpIHVwcGVyLWxlZnQgcXVhZHJhbnQ6IHZlcnkgc3BlY2lhbGl6ZWQvbmljaGUgdGhlbWVzLgoKUGxlYXNlIHNlZSBDb2JvLCBNLiBKLiwgTD9wZXotSGVycmVyYSwgQS4gRy4sIEhlcnJlcmEtVmllZG1hLCBFLiwgJiBIZXJyZXJhLCBGLiAoMjAxMSkuIEFuIGFwcHJvYWNoIGZvciBkZXRlY3RpbmcsIHF1YW50aWZ5aW5nLCBhbmQgdmlzdWFsaXppbmcgdGhlIGV2b2x1dGlvbiBvZiBhIHJlc2VhcmNoIGZpZWxkOiBBIHByYWN0aWNhbCBhcHBsaWNhdGlvbiB0byB0aGUgZnV6enkgc2V0cyB0aGVvcnkgZmllbGQuIEpvdXJuYWwgb2YgSW5mb3JtZXRyaWNzLCA1KDEpLCAxNDYtMTY2LgoKCgpgYGB7ciBUaGVtYXRpY01hcCwgZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD05fQoKTWFwPXRoZW1hdGljTWFwKE0sIGZpZWxkID0gIklEIiwgbiA9IDI1MCwgbWluZnJlcSA9IDUsCiAgc3RlbW1pbmcgPSBGQUxTRSwgc2l6ZSA9IDAuNSwgcmVwZWwgPSBUUlVFKQpwbG90KE1hcCRtYXApCmBgYAoKCkNsdXN0ZXIgZGVzY3JpcHRpb24KYGBge3J9CkNsdXN0ZXJzPU1hcCR3b3Jkc1tvcmRlcihNYXAkd29yZHMkQ2x1c3RlciwtTWFwJHdvcmRzJE9jY3VycmVuY2VzKSxdCmxpYnJhcnkoZHBseXIpCkNMIDwtIENsdXN0ZXJzICU+JSBncm91cF9ieSguZGF0YSRDbHVzdGVyX0xhYmVsKSAlPiUgdG9wX24oNSwgLmRhdGEkT2NjdXJyZW5jZXMpCkNMCmBgYAoKCiMgU2VjdGlvbiA2OiBUaGUgc29jaWFsIHN0cnVjdHVyZSAtIENvbGxhYm9yYXRpb24gQW5hbHlzaXMKCkNvbGxhYm9yYXRpb24gbmV0d29ya3Mgc2hvdyBob3cgYXV0aG9ycywgaW5zdGl0dXRpb25zIChlLmcuIHVuaXZlcnNpdGllcyBvciBkZXBhcnRtZW50cykgYW5kIGNvdW50cmllcyByZWxhdGUgdG8gb3RoZXJzIGluIGEgc3BlY2lmaWMgZmllbGQgb2YgcmVzZWFyY2guIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgZmlndXJlIGJlbG93IGlzIGEgY28tYXV0aG9yIG5ldHdvcmsuIEl0IGRpc2NvdmVycyByZWd1bGFyIHN0dWR5IGdyb3VwcywgaGlkZGVuIGdyb3VwcyBvZiBzY2hvbGFycywgYW5kIHBpdm90YWwgYXV0aG9ycy4gVGhlIHNlY29uZCBmaWd1cmUgaXMgY2FsbGVkICJFZHUgY29sbGFib3JhdGlvbiBuZXR3b3JrIiBhbmQgdW5jb3ZlcnMgcmVsZXZhbnQgaW5zdGl0dXRpb25zIGluIGEgc3BlY2lmaWMgcmVzZWFyY2ggZmllbGQgYW5kIHRoZWlyIHJlbGF0aW9ucy4KCiMjIEF1dGhvciBjb2xsYWJvcmF0aW9uIG5ldHdvcmsKYGBge3IsIEF1IGNvbGxhYm9yYXRpb24gbmV0d29yaywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQpOZXRNYXRyaXggPC0gYmlibGlvTmV0d29yayhNLCBhbmFseXNpcyA9ICJjb2xsYWJvcmF0aW9uIiwgIG5ldHdvcmsgPSAiYXV0aG9ycyIsIHNlcCA9ICI7IikKbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgIG4gPSA1MCwgVGl0bGUgPSAiQXV0aG9yIGNvbGxhYm9yYXRpb24iLHR5cGUgPSAiYXV0byIsIHNpemU9MTAsc2l6ZS5jZXg9VCxlZGdlc2l6ZSA9IDMsbGFiZWxzaXplPTAuNikKYGBgCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBvZiBhdXRob3IgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgQXUgY29sbCBzdGF0LCBjb21tZW50PU5BfQpuZXRzdGF0IDwtIG5ldHdvcmtTdGF0KE5ldE1hdHJpeCkKc3VtbWFyeShuZXRzdGF0LGs9MTUpCmBgYAoKCiMjIEVkdSBjb2xsYWJvcmF0aW9uIG5ldHdvcmsKYGBge3IsIEVkdSBjb2xsYWJvcmF0aW9uIG5ldHdvcmssIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KTmV0TWF0cml4IDwtIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY29sbGFib3JhdGlvbiIsICBuZXR3b3JrID0gInVuaXZlcnNpdGllcyIsIHNlcCA9ICI7IikKbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgIG4gPSA1MCwgVGl0bGUgPSAiRWR1IGNvbGxhYm9yYXRpb24iLHR5cGUgPSAiYXV0byIsIHNpemU9MTAsc2l6ZS5jZXg9VCxlZGdlc2l6ZSA9IDMsbGFiZWxzaXplPTAuNikKYGBgCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBvZiBlZHUgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgRWR1IGNvbGwgc3RhdCwgY29tbWVudD1OQX0KbmV0c3RhdCA8LSBuZXR3b3JrU3RhdChOZXRNYXRyaXgpCnN1bW1hcnkobmV0c3RhdCxrPTE1KQpgYGAKCgojIyBDb3VudHJ5IGNvbGxhYm9yYXRpb24gbmV0d29yawpgYGB7ciwgQ28gY29sbGFib3JhdGlvbiBuZXR3b3JrLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9Ck0gPC0gbWV0YVRhZ0V4dHJhY3Rpb24oTSwgRmllbGQgPSAiQVVfQ08iLCBzZXAgPSAiOyIpCk5ldE1hdHJpeCA8LSBiaWJsaW9OZXR3b3JrKE0sIGFuYWx5c2lzID0gImNvbGxhYm9yYXRpb24iLCAgbmV0d29yayA9ICJjb3VudHJpZXMiLCBzZXAgPSAiOyIpCm5ldD1uZXR3b3JrUGxvdChOZXRNYXRyaXgsICBuID0gZGltKE5ldE1hdHJpeClbMV0sIFRpdGxlID0gIkNvdW50cnkgY29sbGFib3JhdGlvbiIsdHlwZSA9ICJzcGhlcmUiLCBzaXplPTEwLHNpemUuY2V4PVQsZWRnZXNpemUgPSAxLGxhYmVsc2l6ZT0wLjYsIGNsdXN0ZXI9Im5vbmUiKQpgYGAKCkRlc2NyaXB0aXZlIGFuYWx5c2lzIG9mIGNvdW50cnkgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgQ28gY29sbCBzdGF0LCBjb21tZW50PU5BfQpuZXRzdGF0IDwtIG5ldHdvcmtTdGF0KE5ldE1hdHJpeCkKc3VtbWFyeShuZXRzdGF0LGs9MTUpCmBgYAoKCgoKCgoK